
void swapInReferenceVariable(int &a, int &b);
void swapInPointer(int *a, int *b);
void swapInCommonVariable(int a, int b);

#include <iostream>

int main()
{
    using namespace std;
    int rat;
    int &reference = rat;
    // 声明了一个引用变量，注意只能在创建的时候进行初始化，创建之后就和这个变量相关联，就将会一直效忠于他
    // 这个 “int &” 可以理解为一种新的类型，用来存储引用类型变量，类似创建了一个别名

    cout << rat << " at " << &rat << endl;
    cout << reference << " at " << &reference << endl;
    // 可以看到值和地址都是一样的

    int bunnies = 50;
    reference = bunnies;
    // 将引用变成bunnies是不成功的，如果这样理解的话，下面的输出就是力证
    cout << bunnies << " at " << &bunnies << endl;
    cout << reference << " at " << &reference << endl;
    cout << rat << " at " << &rat << endl;

    // 50 at 0x7ffe696d6ddc
    // 50 at 0x7ffe696d6dd8
    // 50 at 0x7ffe696d6dd8

    // 可以发现reference还是rat的地址，并不是bunnies，也就是说 reference = bunnies; 是没有效果的....吗？
    // 上面说到： 理解为“referece是rat的别名” 所以 这句话等价于 rat = bunnies;

    // 利用引用变量访问调用函数中的变量
    // 典型的东西是使用函数交换主方法的变量
    // 下面写三种：两个是有用的，一个是没有用的
    int a = 10;
    int b = 20;
    swapInCommonVariable(a,b);      // 没有效果
    cout << a << "   " << b << endl;
    swapInPointer(&a,&b);           // 交换成功
    cout << a << "   " << b << endl;
    swapInReferenceVariable(a, b); // 交换成功
    //    10   20
    //    20   10
    //    10   20


    return 0;
}

void swapInReferenceVariable(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void swapInPointer(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void swapInCommonVariable(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}